/*
 * Copyright 2015 Ming Xia
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.healthcloud.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.healthcloud.entity.AreaCode;
import com.healthcloud.utils.PageParam;

/**
 * @author Sephy
 * @since: 2015-05-13
 */
public interface AreaCodeService {

	/**
	 * 获取省份地区列表(一级)
	 *
	 * @return
	 */
	List<AreaCode> getProvinceList();

    /**
     * 动态判断获取地区编码
     *
     * @param code
     * @return
     */
	List<AreaCode> getAreaList(Long code);

    /**
     * 批量插入地区数据
     *
     * @param areaCodeList
     * @return
     */
    int saveBatch(List<AreaCode> areaCodeList);

    /**
     * 插入地区数据
     * level:1-4的数据为地区数据base_area_code
     * level:5的数据为地区数据base_area_code_extra
     *
     * @param areaCode
     * @return
     */
    int save(AreaCode areaCode);

    /**
     * 根据当前给定的地区代码,获取地区名称,比如给定330200,返回 浙江省宁波市
     * @param code
     * @return
     */
    String getFullAreaName(Long code);

    /**
     * 根据大区名或者省名称查询大区列表（模糊查询）
     * @param area 区域查询信息
     * @param pageParam 分页参数
     * @return
     */
    List<AreaCode> search(AreaCode area, PageParam pageParam);

    /**
     * 搜索所有的大区信息
     * @return
     */
    ArrayList<AreaCode> searchAll();

    /**
     * 根据大区名或者省名称查询大区列表总行数（模糊查询）
     * @param area 区域查询信息
     * @return
     */
    int count(AreaCode area);

    /**
     * 获取下级地区列表
     * level:0的数据为大区数据
     * level:1-4的数据为地区数据base_area_code
     * level:5的数据为地区数据base_area_code_extra
     *
     * @param code code
     * @param level 地区等级
     * @return
     */
    List<AreaCode> getLowerAreaList(String code, String level);

    /**
     * 获取所有下级地区列表
     *
     * @param code 地区code(不包含大区code)    null为所有列表数据
     * @param num 1：获取到下1级列表； 2获取到下2级列表   null为所有下级列表（level=5）
     * @return
     */
    List<AreaCode> getLowersAreaList(Long code, Integer num);

    /**
     * 根据主键id修改大区code
     * @param id 主键id
     * @param largeAreaCode 大区code
     * @return
     */
    int updateLargeAreaCodeById(String id, String largeAreaCode);

    /**
     * 根据code获取所有地区极品的列表 大区除外
     */
    Map<String, List<AreaCode>> getAreaListAll(String code);

    /**
     * 自定义参数查询出所有符合条件的地区列表
     * */
    List<AreaCode> findByEntityAll(AreaCode entity);

    /**
     * 根据largeAreaCode设置LargeAreaCode为NULL值
     * */
    void setLargeAreaCodeNull(String largeAreaCode);

    String getSomeProvinceAreaForSql(String fieldName,List<AreaCode> provinceList);

    /**
     * 获取所有上下级地区列表
     * 如:code = 3302(宁波市编码)   num = 2（此处意义为 宁波市 下两级地区列表数据  包括宁波市 ）
     * 获取数据格式如：
     * 宁波市  市辖区
     * 宁波市  海曙区 南门街道
     * 宁波市  海曙区 江厦街道
     * .......
     *
     * @param code 地区code(不包含大区code)    null为所有列表数据
     * @param num 1：获取到下1级列表； 2获取到下2级列表   null为所有下级列表（level=5）
     * @return
     */
    List<AreaCode[]> getAreaForLevelList(Long code, Integer num);


    /**
     * 根据 地区name 在指定范围（baseAreaCode开头的）内查询地区
     * @param areaName  地区name(返回的地区信息名称)  (若为null，则查询出所有的地区信息)
     * @param level     地区等级(返回的地区信息等级)  (若为null，则查询出所有的地区信息)
     * @param baseAreaCode  搜索范围（code以baseAreaCode开头的）
     * */
    List<AreaCode> findByAreaNameInAreaCode(String areaName, Integer level, String baseAreaCode);

    /**
     * 根据地区名称 获取code
     * @param areaNameArr 地区名称(名称级别个数不定，但连续并以村名称开始)
     *                    如：村名称，镇名称，县名称，市名称，省名称
     *                    	  村名称，镇名称，县名称
     * @param level areaNameArr中最底层地区等级 （null值 默认为村级别）
     * @param baseAreaCode 查找地区code范围
     * */
    Long getCodeByAreaName(String[] areaNameArr, Integer level, String baseAreaCode) throws Exception;
}
